# encoding: utf-8

from PyQt5.Qt import *
from widget.daoru_page.target_init_page.mysql_target_init import MySqlInitPage
from widget.daoru_page.target_init_page.system_target_init import SystemInitPage
from widget.daoru_page.source_init_page.sqlserver_source_init import SqlServerInitPage
from widget.daoru_page.import_init_page.daoru_page_table import Sqlserver2EsTable
# from widget.daoru_page.import_init_page.daoru_page_table import Excl2EsTable
from widget.daoru_page.source_init_page.excl_source_init import ExclInitFunc
from widget.daoru_page.source_init_page.marc_source_init import MarcInitPage
from widget.daoru_page.source_init_page.choice_excl_sheet_window import ChoiceExclSheetWindow
from widget.daoru_page.source_init_page.noteexpress_source_init import NoteexpressInitFunc
# from widget.daoru_page.source_init_page.choice_noteexpress_type_window import ChoiceNoteexpressTypeWindow
from widget.my_window import MyWindow
from widget.info_box import *
import configparser
import json
from widget.db_init.peewee import testModel229_dp
from widget.db_init.configuration import sql_configuration as LM
from widget.db_init.sqlUtils.mysqlUtils import MySqlOp
import _thread
import time
import xlrd
import xlwt


class MyDaoruPage(QWidget):
    '''
    导入页面
    '''
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.setAttribute(Qt.WA_StyledBackground, True)
        self.my_parent = args[0]
        self.setParent(self.my_parent)
        # 数据导入页面,挂载到右侧操作控件
        self.setup_content_daoru()
        # 设置控件名，用来统一显示隐藏控件
        self.setObjectName('the_base_page')

        # mysql字段配置信息（在子页面中进行配置）
        # self.mysql_field_name_list = []

        # 初始化 当前条、总条数 和 字段个数
        # 当前条current_one 和 总条数sum_one 用于显示页面label，
        # sum_field用于判断是否可以进行导入操作【如果sum_field不为None说明成功加载到了数据，那么可以执行导入操作】
        # self.current_one = None
        # self.sum_one = None
        # self.sum_field = None

        # 来源信息列表
        # self.source_dict = {}
        # 目标信息列表
        # self.target_dict = {}

        # 初始化表格
        self.init_table()


        # 初始化底部按钮
        self.init_bottom_btns()

        # es请求url
        # self.es_url = 'http://127.0.0.1/platform'
        # self.es_url = 'http://192.168.0.230:8085/platform'
        # self.es_url = 'http://192.168.0.10:8094/platform'

        # 导入flag（如果为false，那么终止导入线程）
        # self.run_flag = True

        # 底部按钮
        # self.init_bottom_btns()

        # 已选中的字段(导入时进行判断，如果该队列为空，那么不允许导入)
        # self.checked_target_list = []
        # 未选中的字段(导入时进行判断，如果该队列中包含必填的字段，那么不允许导入)
        # self.not_checked_target_list = []

    # 数据导入页面
    def setup_content_daoru(self):
        '''
        初始化导入页面的方法
        :return:
        '''
        # 来源文件与后缀的字典
        self.file_dict = {
            "Sql-server": ["", ],
            # "请选择": "",
            "Excel": ["xlsx", "xls"],
            "Marc": ["marc", "iso", "mrc", "cnm"],
            "NoteExpress": ["json", ],
            # "Mysql": "sql",
            # "Oracle": "",
        }

        # 导入目标队列
        self.import_list = [
            "系统平台",
            # "Mysql",
            # "Sql-server",
            # "Oracle"
        ]

        # 页面初始化
        # self.daoru_widget = QWidget(self)
        # 数据来源label
        self.daoru_label1 = QLabel(self)
        self.daoru_label1.move(50, 50)
        self.daoru_label1.setText('数据来源:')
        self.daoru_label1.setProperty('my_label_type', 'root_content_label')
        # 数据来源类型下拉选择
        self.daoru_combo1 = QComboBox(self)
        self.daoru_combo1.setFixedWidth(100)
        self.daoru_combo1.setView(QListView())  # 通过setView和全局qss设置行高
        self.daoru_combo1.addItems(s for s in self.file_dict)
        self.daoru_combo1.move(150, 50)
        # 数据源选框切换，改变
        self.daoru_combo1.currentIndexChanged.connect(self.change_daoru_btn1_func)
        # 文件路径label
        self.daoru_label3 = QLabel(self)
        self.daoru_label3.move(300, 50)
        self.daoru_label3.setText('来源配置:')
        self.daoru_label3.setProperty('my_label_type', 'root_content_label')
        # 数据来源文件路径显示位置
        self.daoru_input1 = QLineEdit(self)
        self.daoru_input1.move(400, 50)
        self.daoru_input1.setFixedWidth(300)
        # 数据来源文件路径选择
        self.daoru_btn1 = QPushButton(self)
        self.daoru_btn1.setText('...')
        self.daoru_btn1.move(710, 50)
        self.daoru_btn1.setFixedWidth(30)
        # 进入页面时，默认绑定来源按钮点击进入sqlserver来源
        self.daoru_btn1.clicked.connect(self.show_sqlserver_source_init)


        # 导入目标label
        self.daoru_label2 = QLabel(self)
        self.daoru_label2.move(50, 100)
        self.daoru_label2.setText('导入目标:')
        self.daoru_label2.setProperty('my_label_type', 'root_content_label')
        # 导入目标类型下拉选择
        self.daoru_combo2 = QComboBox(self)
        self.daoru_combo2.setFixedWidth(100)
        self.daoru_combo2.setView(QListView())  # 通过setView和全局qss设置行高
        self.daoru_combo2.addItems(self.import_list)
        self.daoru_combo2.move(150, 100)
        self.daoru_combo2.currentIndexChanged.connect(self.change_daoru_btn2_func)
        # 导入目标详细配置label
        self.daoru_label3 = QLabel(self)
        self.daoru_label3.move(300, 100)
        self.daoru_label3.setText('目标配置:')
        self.daoru_label3.setProperty('my_label_type', 'root_content_label')
        # 导入目标详细配置显示位置
        self.daoru_input2 = QLineEdit(self)
        self.daoru_input2.move(400, 100)
        self.daoru_input2.setFixedWidth(300)
        # 导入目标详细配置选择
        self.daoru_btn2 = QPushButton(self)
        self.daoru_btn2.setText('...')
        self.daoru_btn2.move(710, 100)
        self.daoru_btn2.setFixedWidth(30)
        # 进入页面时，默认绑定目标按钮点击进入es目标
        self.daoru_btn2.clicked.connect(self.show_system_target_init)


        # 预览按钮
        self.daoru_btn3 = QPushButton(self)
        self.daoru_btn3.setText('数据预览')
        self.daoru_btn3.move(800, 50)
        self.daoru_btn3.resize(100, 75)
        # 数据预览按钮绑定事件
        self.daoru_btn3.clicked.connect(lambda: self.dspt_table(self.daoru_combo1.currentText(), self.daoru_combo2.currentText()))
        # self.daoru_btn3.clicked.connect(lambda: self.show_source_data(self.table1.parent().daoru_combo1.currentText(),self.table1.parent().daoru_combo2.currentText()))


        # 基础页面显示隐藏的方法 start -------------------------------------------
        # 初始化完成后先隐藏控件，等待按钮点击后显示
        self.close()
        # 导入按钮被点击时， 隐藏其他页面
        daoru_menu_btn = self.parent().parent().findChild(QPushButton, 'daoru_menu_btn')
        # 关闭其他基础页面的方法
        def close_other_pages():
            other_pages = self.parent().parent().findChildren(QWidget, 'the_base_page')
            for other_page in other_pages:
                other_page.close()
        # 触发关闭其他基础页面的按钮
        daoru_menu_btn.clicked.connect(close_other_pages)
        # 绑定此按钮，点击时显示当前导入页内容和父页面（空白基础页）内容
        daoru_menu_btn.clicked.connect(self.show)
        daoru_menu_btn.clicked.connect(self.my_parent.show)
        # 基础页面显示隐藏的方法 end -------------------------------------------

    def init_table(self):
        self.table1 = QTableWidget(self)
        self.table1.resize(900, 480)
        self.table1.move(50, 150)

        # 特殊功能按钮（依附于表格）
        self.table1.table_func_btn = QPushButton(self, text='...')
        table_func_btn_x = self.table1.geometry().x()
        table_func_btn_y = self.table1.geometry().y()
        self.table1.table_func_btn.move(table_func_btn_x, table_func_btn_y)
        self.table1.table_func_btn.resize(24, 26)
        self.table1.table_func_btn.close()

    # 下一条、上一条、转跳、开始导入 按钮初始化
    def init_bottom_btns(self):
        '''
        导入页面底部按钮初始化 并置灰，等待表格查询有结果的时候启用
        :return:
        '''
        self.current_one = 1
        self.sum_one = 10

        # 上一条按钮
        self.before_btn = QPushButton(self)
        self.before_btn.setText("上一条")
        self.before_btn.setObjectName("daoru_bottom_btn")
        self.before_btn.move(50, 660)
        # self.before_btn.clicked.connect(self.back_one)

        # 下一条按钮
        self.next_btn = QPushButton(self)
        self.next_btn.setText("下一条")
        self.next_btn.setObjectName("daoru_bottom_btn")
        self.next_btn.move(150, 660)
        # self.next_btn.clicked.connect(self.next_one)

        # 转跳输入框
        self.jump_input = QLineEdit(self)
        self.jump_input.setObjectName("daoru_bottom_btn")
        # self.jump_input.setValidator(QIntValidator(1, 10))
        self.jump_input.resize(30, 21)
        self.jump_input.move(250, 660)

        # 转跳按钮
        self.jump_btn = QPushButton(self)
        self.jump_btn.setText("转跳")
        self.jump_btn.setObjectName("daoru_bottom_btn")
        self.jump_btn.move(290, 660)
        self.jump_btn.setFixedWidth(40)
        # self.jump_btn.clicked.connect(lambda: self.fix_page(self.jump_input))
        # self.jump_btn.clicked.connect(jump_want_page)

        # 当前页/总页数 面板
        self.num_show_label = QLabel(self)
        # self.num_show_label.setText("第{0}条 / 共{1}条".format(self.current_one, self.sum_one))
        self.num_show_label.move(360, 665)
        self.num_show_label.setFixedWidth(200)

        # 选择导入方案label -----------------------------------------------------
        self.fangan_label = QLabel(self)
        self.fangan_label.setText("选择导入方案：")
        self.fangan_label.setObjectName("daoru_bottom_btn")
        self.fangan_label.move(50, 709)
        # self.next_btn.clicked.connect(self.next_one)
        # 选择导入方案选择框
        self.fangan_input = QComboBox(self)
        self.fangan_input.setObjectName("daoru_bottom_btn")
        # self.jump_input.setValidator(QIntValidator(1, 10))
        self.fangan_input.setView(QListView())  # 通过setView和全局qss设置行高
        self.fangan_input.setFixedWidth(200)
        self.fangan_input.resize(30, 21)
        self.fangan_input.move(160, 705)
        self.fangan_input.currentTextChanged.connect(self.fangan_fuzhi)
        self.refresh_fangan_input()
        # 删除当前方案
        self.del_fangan_btn = QPushButton(self)
        self.del_fangan_btn.setText("删除当前方案")
        self.del_fangan_btn.setObjectName("daoru_bottom_btn")
        # self.del_fangan_btn.setFixedWidth(30)
        self.del_fangan_btn.move(370, 705)
        self.del_fangan_btn.clicked.connect(self.del_fangan)
        # 生成导入方案btn
        self.fangan_btn = QPushButton(self)
        self.fangan_btn.setText("生成新方案")
        self.fangan_btn.setObjectName("daoru_bottom_btn")
        # self.fangan_btn.setFixedWidth(30)
        self.fangan_btn.move(475, 705)
        self.fangan_btn.clicked.connect(self.add_fangan_name_window)
        # 自动匹配btn
        self.auto_match_btn = QPushButton(self)
        self.auto_match_btn.setText("按名称匹配")
        self.auto_match_btn.setObjectName("daoru_bottom_btn")
        # self.auto_match_btn.setFixedWidth(30)
        self.auto_match_btn.move(565, 705)
        self.auto_match_btn.clicked.connect(self.auto_match)
        # -------------------------------------------------------------------------

        # 创建任务
        self.create_task_btn = QPushButton(self)
        self.create_task_btn.setText("创建任务")
        self.create_task_btn.setObjectName("daoru_bottom_btn")
        # self.create_task_btn.move(760, 650)
        self.create_task_btn.move(860, 650)
        self.create_task_btn.setFixedHeight(80)
        self.create_task_btn.setFixedWidth(90)

        # # 开始导入按钮
        # self.start_import_btn = QPushButton(self)
        # self.start_import_btn.setText("开始导入")
        # self.start_import_btn.setObjectName("daoru_bottom_btn")
        # self.start_import_btn.move(860, 650)
        # self.start_import_btn.setFixedHeight(80)
        # self.start_import_btn.setFixedWidth(90)
        # # self.start_import_btn.clicked.connect(self.start_import)

        # 1.所有底部的按钮绑定事件（点击时更新当前页label）
        # 2.初始化完成后先置灰，等待表格查询有结果的时候启用
        for btn in self.findChildren(QWidget, "daoru_bottom_btn"):
            btn.setEnabled(False)

    def dspt_table(self, source_name, target_name):
        self.table1.clear()
        # if source_name == 'Excl' and target_name == '系统平台':
        #     print('Excl and 系统平台')
        #     self.excl2es_table = Excl2EsTable(self.table1)
        #     self.excl2es_table.show_source_data()
        #
        # elif source_name == 'Sql-server' and target_name == '系统平台':
        #     print('Sql-server and 系统平台')
        self.sqlserver2es_table = Sqlserver2EsTable(self.table1)
        self.sqlserver2es_table.show_source_data()

    # 选择框1的所有事件内容 start --------------------------------------------------------------
    # 监听 daoru_combo1切换事件, 动态修改 daoru_btn1的绑定方法
    def change_daoru_btn1_func(self):
        # 清空表和来源输入框
        self.daoru_input1.clear()
        self.table1.clear()
        qApp.cx_src = {}

        # 获取下拉框选择的内容
        daoru_combo1_key = self.daoru_combo1.currentText()
        if daoru_combo1_key == 'Excel':
            self.daoru_btn1.disconnect()  # 解除绑定之前的事件
            self.daoru_btn1.clicked.connect(self.show_excl_source_init)  # 绑定打开excl事件
        if daoru_combo1_key == 'Sql-server':
            self.daoru_btn1.disconnect()  # 解除绑定之前的事件
            self.daoru_btn1.clicked.connect(self.show_sqlserver_source_init)  # 绑定打开sqlserver配置页事件
        if daoru_combo1_key == 'Marc':
            self.daoru_btn1.disconnect()  # 解除绑定之前的事件
            self.daoru_btn1.clicked.connect(self.show_marc_source_init)  # 绑定打开sqlserver配置页事件
        if daoru_combo1_key == 'NoteExpress':
            self.daoru_btn1.disconnect()  # 解除绑定之前的事件
            self.daoru_btn1.clicked.connect(self.show_noteexpress_source_init)  # 绑定打开sqlserver配置页事件

    # 选择noteexpress文件路径的方法
    def show_noteexpress_source_init(self):
        '''
        调用文件选择器选择文件 并保存到 daoru_input1 中
        :return:
        '''
        self.excl_tag_box = InfoBox('加载notexpress中...')
        self.excl_tag_box.show()
        # 打开excl操作 start ---------------------------------------
        daoru_combo1_key = self.daoru_combo1.currentText()
        # print(daoru_combo1_key)
        file_path = QFileDialog.getOpenFileName(self, "选择文件", "/", "All Files (*)")
        noteexpress_path = file_path[0]
        print(noteexpress_path)
        # 文件数据保存方法（挂载数据到qApp）
        if not noteexpress_path:
            self.excl_tag_box.close()
            return
        else:
            neit = NoteexpressInitFunc(noteexpress_path)
            ne_data = neit.readNoteExpress()
            qApp.cx_src = neit.noteexpress2qApp(ne_data)
            self.daoru_input1.setText(noteexpress_path)


            # self.choice_notexpress_type_window = ChoiceNoteexpressTypeWindow(my_parent=self, width=900, height=550)
            # self.choice_notexpress_type_window.show()


            # self.daoru_input1.setText(noteexpress_path)
            # neit = NoteexpressInitFunc(noteexpress_path)
            # ne_data = neit.readNoteExpress()
            # print(ne_data)
            # neit.noteexpress2qApp(ne_data)


            # 加载ne数据挂载到qApp

            # # 获取excl文件中所有的sheet
            # workbook = xlrd.open_workbook(excl_path)
            # # 打开sheet文件选择框
            # self.choice_excl_sheet_window = ChoiceExclSheetWindow(width=900, height=550, my_parent=self,
            #                                                       excl_path=excl_path, workbook=workbook)
            # self.choice_excl_sheet_window.show()
            # # 打开excl操作 end ---------------------------------------
            # # 关闭提示
        self.excl_tag_box.close()

    # 选择excl文件路径方法
    def show_excl_source_init(self):
        '''
        调用文件选择器选择文件 并保存到 daoru_input1 中
        :return:
        '''
        self.excl_tag_box = InfoBox('加载excel中...')
        self.excl_tag_box.show()
        # 打开excl操作 start ---------------------------------------
        daoru_combo1_key = self.daoru_combo1.currentText()
        # print(daoru_combo1_key)
        file_path = QFileDialog.getOpenFileName(self, "选择文件", "/", "Text Files ({0});;All Files (*)".format(' '.join(['*.{0}'.format(ext) for ext in self.file_dict[daoru_combo1_key]])))
        excl_path = file_path[0]
        print(excl_path)
        # 文件数据保存方法（挂载数据到qApp）
        if not excl_path:
            self.excl_tag_box.close()
            return
        else:
            # 打开excl比较慢，先给个弹窗，然后完成操作时关掉
            # self.excl_func = ExclInitFunc(excl_path)
            # self.excl_func.excl2qApp()
            # 路径保存到输入框中
            # self.daoru_input1.setText(excl_path)

            # 获取excl文件中所有的sheet
            workbook = xlrd.open_workbook(excl_path)
            # sheet_list = workbook.sheet_names()
            # print(sheet_list)
            # 打开sheet文件选择框
            self.choice_excl_sheet_window = ChoiceExclSheetWindow(width=900, height=550, my_parent=self, excl_path=excl_path, workbook=workbook)
            self.choice_excl_sheet_window.show()
            # 打开excl操作 end ---------------------------------------
            # 关闭提示
        self.excl_tag_box.close()

    # 选择marc文件路径方法
    def show_marc_source_init(self):
        '''
        调用文件选择器选择文件 并保存到 daoru_input1 中
        :return:
        '''
        self.marc_init_win = MarcInitPage(my_parent=self, width=900, height=550)
        self.marc_init_win.show()

        # # 打开excl操作 start ---------------------------------------
        # daoru_combo1_key = self.daoru_combo1.currentText()
        # # print(daoru_combo1_key)
        # file_path = QFileDialog.getOpenFileName(self, "选择文件", "/", "Text Files (*.{0});;All Files (*)".format(' '.join(['*.{0}'.format(ext) for ext in self.file_dict[daoru_combo1_key]])))
        # marc_path = file_path[0]
        # print(marc_path)
        # # 文件数据保存方法（挂载数据到qApp）
        # if not marc_path:
        #     return
        # else:
        #     # 打开excl比较慢，先给个弹窗，然后完成操作时关掉
        #     self.excl_tag_box = InfoBox('加载excl中...')
        #     self.excl_tag_box.show()
        # # self.excl_func = ExclInitFunc(marc_path)
        # # self.excl_func.excl2qApp()
        # # # 路径保存到输入框中
        # # self.daoru_input1.setText(marc_path)
        # # # 打开excl操作 end ---------------------------------------
        # # # 关闭提示
        # self.excl_tag_box.close()

    # 初始化sqlserver配置页面 并展示
    def show_sqlserver_source_init(self):
        '''
        初始化 mysql配置页面，挂载到当前页面
        :return:
        '''
        root_window = self.parent().parent()
        print('root_window:{0}'.format(root_window))
        self.show_import_init_page = SqlServerInitPage(width=900, height=550, my_parent=self)
        self.show_import_init_page.show()
        # 配置页面存在时，主页面设置为不可选，并且关闭时恢复主页面为可选
        # root_window.setEnabled(False)
        # def root_window_enable():
        #     '''
        #     设置主窗口可编辑
        #     :return:
        #     '''
        #     root_window.setEnabled(True)
        # self.show_import_init_page.close_btn.clicked.connect(root_window_enable)
    # 选择框1的所有事件内容 end --------------------------------------------------------------

    # 选择框2的所有事件内容 start --------------------------------------------------------------
    # 监听 daoru_combo1切换事件, 动态修改 daoru_btn1的绑定方法
    def change_daoru_btn2_func(self):
        # 获取下拉框选择的内容
        daoru_combo2_key = self.daoru_combo2.currentText()
        if daoru_combo2_key == 'Mysql':
            self.daoru_btn2.disconnect()  # 解除绑定之前的事件
            self.daoru_btn2.clicked.connect(self.show_mysql_target_init)  # 绑定打开excl事件
        if daoru_combo2_key == '系统平台':
            self.daoru_btn2.disconnect()  # 解除绑定之前的事件
            self.daoru_btn2.clicked.connect(self.show_system_target_init)  # 绑定打开sqlserver配置页事件

    def show_mysql_target_init(self):
        '''
        初始化 mysql配置页面，挂载到当前页面
        :return:
        '''
        root_window = self.parent().parent()
        print('root_window:{0}'.format(root_window))
        self.show_import_init_page = MySqlInitPage(width=900, height=550, my_parent=self)
        self.show_import_init_page.show()
        # 配置页面存在时，主页面设置为不可选，并且关闭时恢复主页面为可选
        # root_window.setEnabled(False)
        #
        # def root_window_enable():
        #     '''
        #     设置主窗口可编辑
        #     :return:
        #     '''
        #     root_window.setEnabled(True)
        #
        # self.show_import_init_page.close_btn.clicked.connect(root_window_enable)

    def show_system_target_init(self):
        '''
        初始化 系统平台配置页面，挂载到当前页面
        :return:
        '''
        root_window = self.parent().parent()
        print('root_window:{0}'.format(root_window))
        self.show_import_init_page = SystemInitPage(width=900, height=550, my_parent=self)
        self.show_import_init_page.show()
        # 配置页面存在时，主页面设置为不可选，并且关闭时恢复主页面为可选
        # root_window.setEnabled(False)
        #
        # def root_window_enable():
        #     '''
        #     设置主窗口可编辑
        #     :return:
        #     '''
        #     root_window.setEnabled(True)
        #
        # self.show_import_init_page.close_btn.clicked.connect(root_window_enable)
    # 选择框2的所有事件内容 end --------------------------------------------------------------

    def add_fangan_name_window(self):
        '''
        添加方案名称窗口
        :return:
        '''
        self.add_fangan_window = CustomBox(title='请输入方案名称：')
        self.name_input = QLineEdit(self.add_fangan_window)
        # self.name_input.setText()
        self.name_input.move(50, 100)
        self.name_input.setFixedWidth(200)
        self.add_fangan_window.show()
        self.add_fangan_window.enter_btn.clicked.connect(self.save_fangan)

    def get_init_file_cf(self):
        cf = configparser.ConfigParser()
        print(qApp.cx_project_root.replace('\\', '/') + '/init_file/init/fangan.ini')
        cf.read(qApp.cx_project_root.replace('\\', '/') + '/init_file/init/fangan.ini')
        return cf

    def init_write(self, cf):
        cf.write(open(qApp.cx_project_root.replace('\\', '/') + r'/init_file/init/fangan.ini', "w"))

    def save_fangan(self):
        '''
        保存方案
        :return:
        '''
        cur_sec = self.name_input.text()
        cf = self.get_init_file_cf()
        secs = cf.sections()
        if not cur_sec:
            self.famcf_box = InfoBox('请输入方案名称')
            self.famcf_box.show()
            return
        if secs:
            if cur_sec in secs:
                self.famcf_box = InfoBox('方案名称重复')
                self.famcf_box.show()
                return
        fangan_json = self.get_fangan_json()
        cf.add_section(cur_sec)
        cf.set(cur_sec, 'key_value_json', json.dumps(fangan_json, ensure_ascii=False))
        self.init_write(cf)
        self.refresh_fangan_input()
        self.add_fangan_window.close()

        self.cjfacg_box = InfoBox('方案创建成功')
        self.cjfacg_box.show()

    def get_fangan_json(self):
        '''
        获取当前方案的json
        :return:
        '''
        fangan_list = []
        for i in range(self.table1.rowCount()):
            fangan = {}
            src_name = self.table1.item(i, 0).text()
            tar_name = self.table1.cellWidget(i, 1).currentText()
            if tar_name == '不导入':
                continue
            if self.table1.cellWidget(i, 3):
                check_flag = 1 if self.table1.cellWidget(i, 3).isChecked() else 0
                check_func = self.table1.cellWidget(i, 4).currentText()
                fangan['src_name'] = src_name
                fangan['tar_name'] = tar_name
                fangan['check_flag'] = check_flag
                fangan['check_func'] = check_func
            else:
                fangan['src_name'] = src_name
                fangan['tar_name'] = tar_name
            fangan_list.append(fangan)
        print(print('fangan_list:{0}'.format(fangan_list)))
        return fangan_list

    def refresh_fangan_input(self):
        '''
        刷新方案选择框
        :return:
        '''
        cf = self.get_init_file_cf()
        secs = cf.sections()
        self.fangan_input.clear()
        self.fangan_input.addItem('不使用')
        if secs:
            self.fangan_input.addItems(secs)

    def fangan_fuzhi(self, fangan_name):
        '''
        将导入方案赋值到表上
        :return:
        '''
        if fangan_name == '不使用' or fangan_name == '':
            return
        cf = self.get_init_file_cf()
        kl = cf.get(fangan_name, "key_value_json")
        fangan_json = json.loads(kl)
        # print(fangan_json)

        # 选项清空
        for i in range(self.table1.rowCount()):
            self.table1.cellWidget(i, 1).setCurrentText('不导入')
            if self.table1.cellWidget(i, 3):
                self.table1.cellWidget(i, 3).setChecked(False)
                self.table1.cellWidget(i, 4).setCurrentText('覆盖')

        # 选项赋值
        for i in range(self.table1.rowCount()):
            src_name = self.table1.item(i, 0).text()
            for fangan in fangan_json:
                if fangan['src_name'] == src_name:
                    self.table1.cellWidget(i, 1).setCurrentText(fangan['tar_name'])
                    if self.table1.cellWidget(i, 3):
                        self.table1.cellWidget(i, 3).setChecked(bool(fangan['check_flag']))
                        self.table1.cellWidget(i, 4).setCurrentText(fangan['check_func'])
                    break
            # print('fangan_json:{0}'.format(fangan_json))

    def auto_match(self):
        '''
        自动匹配按钮
        :return:
        '''
        # 换成table中的值 todo
        for i in range(self.table1.rowCount()):
            # 设置目标字段自动匹配 start -----------------------------------
            # target_name_match()
            if qApp.cx_src['name'] == 'marc':
                s_name = (self.table1.item(i, 0).text()).split('(')[1][:-1] if '(' in self.table1.item(i, 0).text() else self.table1.item(i, 0).text()
            else:
                s_name = self.table1.item(i, 0).text()

            # 目标字段赋值
            for n, t_name in enumerate(qApp.cx_tgt['target_name_list']):
                if s_name == t_name.split('[')[0]:
                    self.table1.cellWidget(i, 1).setCurrentText(t_name)
            # 设置目标字段自动匹配 end -------------------------------------

    def del_fangan(self):
        '''
        删除当前方案
        :return:
        '''
        if self.fangan_input.currentText() == '不使用':
            self.wxzfa_box = InfoBox('未选中方案')
            self.wxzfa_box.show()
            return
        self.qdyscm_box = ChoiceBox('确定要删除当前方案吗')
        def delete_mc():
            cur_fangan = self.fangan_input.currentText()
            cf = self.get_init_file_cf()
            cf.remove_section(cur_fangan)
            self.init_write(cf)
            self.refresh_fangan_input()
            self.qdyscm_box.close()
            self.sccg_box = InfoBox('删除成功')
            self.sccg_box.show()
        self.qdyscm_box.enter_btn.clicked.connect(delete_mc)
        self.qdyscm_box.show()